using System;
using System.Collections.Generic;
using System.Text;
using AEL.ACT;
using AEL.BOD;
using BEL;


namespace DEL.BOD
{

    
    public class DO_Bod_Kardex
    {
        //Bloqueo de clases estaticas
        private static object thisLock = new object();

        #region Adapter
        private static CEL.BOD.DO_Bod_Kardex _adpBod_Kardex;
        private static CEL.BOD.DO_Bod_Kardex adpBod_Kardex
        {
            get
            {
                if (_adpBod_Kardex == null)
                    _adpBod_Kardex = new CEL.BOD.DO_Bod_Kardex();
                return _adpBod_Kardex;
            }
        }

        private static CEL.BOD.DO_Bod_Orden _adpBod_Orden;
        private static CEL.BOD.DO_Bod_Orden adpBod_Orden
        {
            get
            {
                if (_adpBod_Orden == null)
                    _adpBod_Orden = new CEL.BOD.DO_Bod_Orden();
                return _adpBod_Orden;
            }
        }
    #endregion

        #region Operaciones con datos


        public static void EmitirExcepcion(string mensaje, string caso)
        {
            Exception eCaso = new System.Exception(caso);
            Exception otroEX = new System.Exception(mensaje, eCaso);
            throw otroEX;
        }

        public static void Insert(Scope s, ref Bod_Kardex p_Objeto)
        {
            try
            {
                decimal v_stock = 0;
                lock (thisLock)
                {
                    adpBod_Kardex.Adapter.BeginTransaction();

                    List<AEL.BOD.Bod_Kardex> lstBodKardex = null;
                    lstBodKardex = adpBod_Kardex.GetByStockActual(s, p_Objeto.Bod_Bodega_Id, p_Objeto.Com_Articulo_Id, p_Objeto.Fecha);
                    Bod_Kardex bodKardex = new Bod_Kardex();
                    if (lstBodKardex.Count > 1)
                        EmitirExcepcion(TXT_Mensajes._MSJ54, "");
                    else if (lstBodKardex.Count == 0)
                    {
                        v_stock = 0;
                        p_Objeto.Secuencia = 0;
                    }
                    else if (lstBodKardex.Count == 1)
                    {
                        bodKardex = lstBodKardex[0];
                        v_stock = bodKardex.Stock;
                        p_Objeto.Secuencia = bodKardex.Secuencia + 1;
                    }

                    p_Objeto.Secuencia = bodKardex.Secuencia + 1;
                    if (p_Objeto.Tipo == "EGR")
                    {
                        p_Objeto.Stock = v_stock - p_Objeto.Cantidad;
                    }
                    else
                    {
                        p_Objeto.Stock = v_stock + p_Objeto.Cantidad;
                    }

                    if (p_Objeto.Cantidad < 0)
                        EmitirExcepcion(TXT_Mensajes._MSJ55, "");

                    if (p_Objeto.Stock < 0)
                        EmitirExcepcion(TXT_Mensajes._MSJ56, "");
                  
                    p_Objeto.Id = adpBod_Kardex.Insert(s, p_Objeto);                    
                                       
                    List<Bod_Kardex> lstbodKardex = adpBod_Kardex.GetByNueva_Secuencia_Insert(s, p_Objeto.Bod_Bodega_Id, p_Objeto.Com_Articulo_Id, p_Objeto.Secuencia);
                    if (lstbodKardex.Count == 1)
                    {
                        Bod_Kardex bodkardex = lstbodKardex[0];

                        adpBod_Kardex.GetByUpdate_Kardex(s, bodkardex.Id, bodkardex.Secuencia, bodkardex.Stock,
                                                         bodkardex.Int_Empresa_Id, bodkardex.Bod_Bodega_Id,
                                                         bodkardex.Com_Articulo_Id, bodkardex.Update_Per_Personal_Id);
                    }
                    adpBod_Kardex.Adapter.CommitTransaction();
                }
            }
            catch (Exception e)
            {
                adpBod_Kardex.Adapter.RollbackTransaction();
                throw (e) ;
            }            
        }

        public static Bod_Kardex copiarKardex(Bod_Kardex p_Objeto)
        {
            return new Bod_Kardex(p_Objeto);  
        }

        public static void Delete(Scope s, Bod_Kardex p_Objeto)
        {
            try
            {
                lock (thisLock)
                {

                    adpBod_Kardex.Adapter.BeginTransaction();
                   
                    adpBod_Kardex.Delete(s, p_Objeto);
                    List<Bod_Kardex> lstBodKardex = adpBod_Kardex.GetByNueva_Secuencia_Delete(s, p_Objeto.Bod_Bodega_Id, p_Objeto.Com_Articulo_Id, p_Objeto.Secuencia);
                    if (lstBodKardex.Count == 1)
                    {
                        Bod_Kardex bodKardex = lstBodKardex[0];
                        adpBod_Kardex.GetByUpdate_Kardex(s, bodKardex.Id, bodKardex.Secuencia, bodKardex.Stock, bodKardex.Int_Empresa_Id, bodKardex.Bod_Bodega_Id,
                                                      bodKardex.Com_Articulo_Id, bodKardex.Update_Per_Personal_Id);
                    }
                    adpBod_Kardex.Adapter.CommitTransaction();
                }
            }
            catch (Exception e)
            {
                adpBod_Kardex.Adapter.RollbackTransaction();
                throw (e);
            }
         
        }

        public static void Insert_Conteo_Fisico(Scope s, ref Bod_Kardex p_Objeto)
        {
            try
            {
                decimal v_stock = 0;
                lock (thisLock)
                {
                    adpBod_Kardex.Adapter.BeginTransaction();
                   
                    List<AEL.BOD.Bod_Kardex> lstBodKardex = null;
                    lstBodKardex = adpBod_Kardex.GetByStockActual(s, p_Objeto.Bod_Bodega_Id, p_Objeto.Com_Articulo_Id, p_Objeto.Fecha);
                    if (lstBodKardex.Count == 0)
                    {
                        v_stock = 0;
                        p_Objeto.Secuencia = 0;
                    }

                    if (lstBodKardex.Count > 1)
                        EmitirExcepcion(TXT_Mensajes._MSJ54, "");

                    if (lstBodKardex.Count == 1)
                    {
                        Bod_Kardex bodKardex = lstBodKardex[0];
                        v_stock = bodKardex.Stock;
                        p_Objeto.Secuencia = bodKardex.Secuencia + 1;
                    }

                    if (v_stock == p_Objeto.Cantidad)
                    { }
                        else if (v_stock < p_Objeto.Cantidad)
                        {
                            p_Objeto.Cantidad = p_Objeto.Cantidad - v_stock;
                            p_Objeto.Tipo = "ING";
                            p_Objeto.Stock = v_stock + p_Objeto.Cantidad;
                        }
                        else if (v_stock > p_Objeto.Cantidad)
                        {
                            p_Objeto.Cantidad = v_stock - p_Objeto.Cantidad;
                            p_Objeto.Tipo = "EGR";
                            p_Objeto.Stock = v_stock - p_Objeto.Cantidad;
                        }

                
                    if (p_Objeto.Cantidad < 0)
                        EmitirExcepcion(TXT_Mensajes._MSJ55, "");
                    if (p_Objeto.Stock < 0)
                        EmitirExcepcion(TXT_Mensajes._MSJ56, "");

                    adpBod_Kardex.Insert(s, p_Objeto);

                    List<Bod_Kardex> lstbodKardex = adpBod_Kardex.GetByNueva_Secuencia_Insert(s, p_Objeto.Bod_Bodega_Id, p_Objeto.Com_Articulo_Id, p_Objeto.Secuencia);
                    if (lstbodKardex.Count==1)
                    {
                        Bod_Kardex bodkardex = lstbodKardex[0];
                        adpBod_Kardex.GetByUpdate_Kardex(s, bodkardex.Id, bodkardex.Secuencia, bodkardex.Stock,
                                                         bodkardex.Int_Empresa_Id, bodkardex.Bod_Bodega_Id,
                                                         bodkardex.Com_Articulo_Id, bodkardex.Update_Per_Personal_Id);                       
                    }
                    adpBod_Kardex.Adapter.CommitTransaction();
                }
            }
            catch (Exception e)
            {
                adpBod_Kardex.Adapter.RollbackTransaction();
                throw (e);
            }
            
        }
        #endregion


    }
}
